package com.leetcode.partition16;

import java.util.Arrays;

/**
 * @author `RKC`
 * @date 2021/9/21 9:16
 */
public class LC1567乘积为正数的最长子数组长度 {

    public static int getMaxLen(int[] nums) {
        return dynamicProgramming(nums);
    }

    public static void main(String[] args) {
//        int[] nums = {1, -2, -3, 4};
//        int[] nums = {0, 1, -2, -3, -4};
//        int[] nums = {-1, -2, -3, 0, 1};
        int[] nums = {-1, 2};
        System.out.println(getMaxLen(nums));
    }

    private static int dynamicProgramming(int[] nums) {
        //dp[0][i]：乘积为负数的最长子数组nums[0, i]长度        dp[1][i]：乘积为正数的最长子数组nums[0, i]长度
        int[][] dp = new int[2][nums.length];
        if (nums[0] > 0) dp[1][0] = 1;
        else if (nums[0] < 0) dp[0][0] = 1;
        int answer = dp[1][0];
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > 0) {
                if (dp[0][i - 1] != 0) dp[0][i] = dp[0][i - 1] + 1;     //如果负数前一项不为0，则负数当前最长可以由前一项乘以当前正数
                dp[1][i] = dp[1][i - 1] + 1;                //当前正数最长可以用上一项的正数乘以当前正数得到
            } else if (nums[i] < 0) {
                dp[0][i] = dp[1][i - 1] + 1;                //负数最长可以由上一项的正数最长乘以当前负数项
                if (dp[0][i - 1] != 0) dp[1][i] = dp[0][i - 1] + 1;     //如果上一项负数项不为0，则正数当前最长可以由前一项负数项乘以当前项
            }
            answer = Math.max(answer, dp[1][i]);
        }
        Arrays.stream(dp).forEach(val -> System.out.println(Arrays.toString(val)));
        return answer;
    }
}
